﻿//************************************************************************************************************
// CoNatural.Threading.dll
// Author: Roger Torres
//************************************************************************************************************
// You can use, modify, and distribute the source code and executable programs based on the source code.
// This source code is provided "as is" and without warranties as to performance or merchantability. 
// The author and/or distributors of this source code may have made statements about this source code. 
// Any such statements do not constitute warranties and shall not be relied on by the user in deciding 
// whether to use this source code. This source code is provided without any express or implied warranties 
// whatsoever. Because of the diversity of conditions and hardware under which this source code may be used, 
// no warranty of fitness for a particular purpose is offered. The user is advised to test the source code 
// thoroughly before relying on it. The user must assume the entire risk of using the source code.
//************************************************************************************************************

using System;

namespace CoNatural.Threading.Async {
   /// <summary>
   /// Exceptions raised by asynchronous operations.
   /// </summary>
	public class AsyncActionException : Exception {
      /// <summary>
      /// The action responsible for the exception.
      /// </summary>
		public AsyncAction Action { get; private set; }

		internal AsyncActionException(AsyncAction action, string message, Exception innerException)
			: base(message, innerException) {
			Action = action;
		}

		internal AsyncActionException(AsyncAction action, string message) : this(action, message, null) { }
		internal AsyncActionException(AsyncAction action) : this(action, null) { }
	}

   /// <summary>
   /// Special exception for invalid actions
   /// </summary>
	public class InvalidAsyncActionException : AsyncActionException {
		internal InvalidAsyncActionException(AsyncAction action, string message)
			: base(action, message) { }
	}

   /// <summary>
   /// Special exception to collect internal action's exceptions
   /// </summary>
	public class AsyncContextException : Exception {
      /// <summary>
      /// Exceptions raised by internal actions
      /// </summary>
		public AsyncActionException[] Errors { get; private set; }

		internal AsyncContextException(AsyncActionException[] errors) {
			Errors = errors;
		}
	}
}
